Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 9307)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -552,7 +552,7 @@
 
     ClearAfterSeek();
 
-    if (ringBuffer->isDVD())
+    if (ringBuffer->InDVDMenuOrStillFrame())
         ringBuffer->Seek(ringBuffer->DVD()->GetCellStartPos(), SEEK_SET);
 
     if (textDisplayMode)
@@ -765,9 +765,6 @@
 int NuppelVideoPlayer::OpenFile(bool skipDsp, uint retries,
                                 bool allow_libmpeg2)
 {
-    if (ringBuffer && ringBuffer->isDVD())
-        allow_libmpeg2 = false;
-
     if (!skipDsp)
     {
         if (!ringBuffer)
Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 9307)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -274,7 +274,8 @@
       allow_ac3_passthru(false),    allow_dts_passthru(false),
       disable_passthru(false),
       // DVD
-      lastdvdtitle(0), dvdmenupktseen(false)
+      lastdvdtitle(0), dvdmenupktseen(false),
+      dvdvideopause(false)
 {
     bzero(&params, sizeof(AVFormatParameters));
     bzero(prvpkt, 3 * sizeof(char));
@@ -1322,7 +1323,7 @@
         }
     }
 
-    // Select a new tracks at the next opportunity.
+    // Select a new track at the next opportunity
     ResetTracks();
 
     // We have to do this here to avoid the NVP getting stuck
@@ -1738,6 +1739,7 @@
 #define PICTURE_START 0x00000100
 #define SLICE_MIN     0x00000101
 #define SLICE_MAX     0x000001af
+#define SEQ_END_CODE  0x000001b7
 
 void AvFormatDecoder::MpegPreProcessPkt(AVStream *stream, AVPacket *pkt)
 {
@@ -1757,6 +1759,14 @@
         unsigned int last_state = state;
         state = ((state << 8) | v) & 0xFFFFFF;
 
+        if (ringBuffer->isDVD() && pkt->size == 4 
+                && state == SEQ_END_CODE && !dvdvideopause)
+        {
+            dvdvideopause = true;
+            d->ResetMPEG2();
+            return;
+        }
+        
         if (last_state != 0x000001)
             continue;
         else if (state >= SLICE_MIN && state <= SLICE_MAX)
@@ -2232,7 +2242,6 @@
 
     bool allowedquit = false;
     bool storevideoframes = false;
-    bool dvdvideopause = false;
 
     avcodeclock.lock();
     AutoSelectTracks();
@@ -2265,7 +2274,7 @@
                 VERBOSE(VB_PLAYBACK,
                     QString(LOC + "DVD Title Changed. Update framesPlayed: %1 ")
                             .arg(framesPlayed));
-                ScanStreams(false);
+                ScanStreams(true);
             }
             lastdvdtitle = dvdtitle;
             
@@ -2291,12 +2300,6 @@
             }
         }
 
-        if (ringBuffer->isDVD() && ringBuffer->DVD()->InStillFrame())
-        {
-            storevideoframes = false;
-            dvdvideopause = true;
-        }
-
         if (!storevideoframes && storedPackets.count() > 0)
         {
             if (pkt)
@@ -2346,11 +2349,25 @@
         if (pkt->dts != (int64_t)AV_NOPTS_VALUE)
             pts = (long long)(av_q2d(curstream->time_base) * pkt->dts * 1000);
 
-        if (ringBuffer->isDVD() && pkt->size == 4)
+        if (ringBuffer->isDVD() && 
+                curstream->codec->codec_type == CODEC_TYPE_VIDEO)
         {
-            dvdvideopause = true;
-            av_free_packet(pkt);
-            continue;
+            if (pkt->size == 4)
+                MpegPreProcessPkt(curstream,pkt);
+            else if (!d->HasMPEG2Dec())
+            {
+                int current_width = curstream->codec->width;
+                int video_width = GetNVP()->GetVideoWidth();
+                if (video_width > 0 &&
+                    (video_width != current_width))
+                {
+                    av_free_packet(pkt);
+                    av_find_stream_info(ic);
+                    ScanStreams(false);
+                    allowedquit = true;
+                    continue;
+                }
+            }
         }
 
         if (storevideoframes &&
@@ -2390,6 +2407,9 @@
                 }
             }
 
+            if (len == 4 && dvdvideopause)
+                dvdvideopause = false;
+
             if (framesRead == 0 && !justAfterChange &&
                 !(pkt->flags & PKT_FLAG_KEY))
             {
@@ -2594,7 +2614,7 @@
                         ret = avcodec_decode_video(context, &mpa_pic,
                                                    &gotpicture, ptr, len);
                         // Reparse it to not drop the DVD still frame
-                        if (dvdvideopause && storedPackets.count() == 0)
+                        if (dvdvideopause)
                             ret = avcodec_decode_video(context, &mpa_pic,
                                                         &gotpicture, ptr, len);
                     }
Index: libs/libmythtv/avformatdecoder.h
===================================================================
--- libs/libmythtv/avformatdecoder.h	(revision 9307)
+++ libs/libmythtv/avformatdecoder.h	(working copy)
@@ -237,6 +237,7 @@
     // DVD
     int lastdvdtitle;
     bool dvdmenupktseen;
+    bool dvdvideopause;
 };
 
 #endif
