Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	(revision 9787)
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -6247,4 +6247,10 @@
 }
 // EIA-708 caption support -- end
 
+void NuppelVideoPlayer::SetVideoResize(const QRect &videoRect)
+{
+    if (videoOutput)
+        videoOutput->SetVideoResize(videoRect);
+}
+
 /* vim: set expandtab tabstop=4 shiftwidth=4: */
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.h
===================================================================
--- mythtv/libs/libmythtv/NuppelVideoPlayer.h	(revision 9787)
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.h	(working copy)
@@ -158,6 +158,7 @@
 
     void SetOSDFontName(const QString osdfonts[22], const QString &prefix);
     void SetOSDThemeName(const QString themename);
+    void SetVideoResize(const QRect &videoRect);
 
     // Toggle Sets
     void ToggleLetterbox(int letterboxMode = -1);
Index: mythtv/libs/libmythtv/videooutbase.cpp
===================================================================
--- mythtv/libs/libmythtv/videooutbase.cpp	(revision 9787)
+++ mythtv/libs/libmythtv/videooutbase.cpp	(working copy)
@@ -175,6 +175,12 @@
     piph_out(-1),             pipw_out(-1),
     piptmpbuf(NULL),          pipscontext(NULL),
 
+    // Video resizing
+    resizew_in(-1),           resizeh_in(-1),
+    resizew_out(-1),          resizeh_out(-1),
+    videoResizeSize(0,0,0,0), videotmpbuf(NULL),
+    videoscontext(NULL),      resizeVideo(false),
+
     // Deinterlacing
     m_deinterlacing(false),   m_deintfiltername("linearblend"),
     m_deintFiltMan(NULL),     m_deintFilter(NULL),
@@ -198,6 +204,8 @@
 {
     ShutdownPipResize();
 
+    ShutdownVideoResize();
+
     if (m_deintFilter)
         delete m_deintFilter;
     if (m_deintFiltMan)
@@ -1188,6 +1196,126 @@
     pipplayer->ReleaseCurrentFrame(pipimage);
 }
 
+void VideoOutput::DoVideoResize(int video_width, int video_height, int desired_width, int desired_height)
+{
+    if (video_width   != resizew_in  ||
+        video_height  != resizeh_in  ||
+        desired_width != resizew_out ||
+        desired_height!= resizeh_out )
+    {
+        ShutdownVideoResize();
+
+        videotmpbuf = new unsigned char[desired_height * desired_width * 3 / 2];
+
+        resizeh_in  = video_height;
+        resizew_in  = video_width;
+        resizew_out = desired_width;
+        resizeh_out = desired_height;
+
+        videoscontext = img_resample_init(resizew_out, resizeh_out, resizew_in, resizeh_in);
+    }
+}
+
+void VideoOutput::ResizeVideo(VideoFrame *frame)
+{
+    if (videoResizeSize.isNull() || frame->codec !=  FMT_YV12)
+        return;
+
+    QRect resize = videoResizeSize;
+
+    // if resize is outside existing frame, abort
+    if((resize.right()  > frame->width  || 
+        resize.bottom() > frame->height ||
+        resize.width()    > frame->width  ||
+        resize.height()   > frame->height))
+    {
+        resizeVideo = false;
+        ShutdownVideoResize();
+        videoResizeSize.setRect(0,0,0,0);
+        return;
+    }
+    // if resize = existing frame size, no need to carry on
+    if(resize.left()   == 0 &&
+       resize.top()    == 0 &&
+      (resize.width()  == frame->width) &&
+      (resize.height() == frame->height))
+    {
+        resizeVideo = false;
+        ShutdownVideoResize();
+        videoResizeSize.setRect(0,0,0,0);
+        return;
+    }
+    DoVideoResize(frame->width, frame->height, resize.width(), resize.height());
+    if (videotmpbuf && videoscontext)
+    {
+        AVPicture img_in, img_out;
+
+        avpicture_fill(&img_out, (uint8_t *)videotmpbuf, PIX_FMT_YUV420P,
+                       resize.width(), resize.height());
+        avpicture_fill(&img_in, (uint8_t *)frame->buf, PIX_FMT_YUV420P,
+                       frame->width, frame->height);
+        img_resample(videoscontext, &img_out, &img_in);
+    }
+
+    int xoff = resize.left();
+    int yoff = resize.top();
+    int resw = resize.width();
+    // Copy Y (intensity values)
+    for (int i = 0; i < resize.height(); i++)
+    {
+        memcpy(frame->buf + (i + yoff) * frame->width + xoff,
+               videotmpbuf + i * resw, resw);
+    }
+    // Copy U & V (half plane chroma values)
+    xoff /= 2;
+    yoff /= 2;
+
+    unsigned char *uptr = frame->buf + frame->width * frame->height;
+    unsigned char *vptr = frame->buf + frame->width * frame->height * 5 / 4;
+    int vidw = frame->width / 2;
+
+    unsigned char *videouptr = videotmpbuf + resw * resize.height();
+    unsigned char *videovptr = videotmpbuf + resw * resize.height() * 5 / 4;
+    resw /= 2;
+    for (int i = 0; i < resize.height() / 2; i ++)
+    {
+        memcpy(uptr + (i + yoff) * vidw + xoff, videouptr + i * resw, resw);
+        memcpy(vptr + (i + yoff) * vidw + xoff, videovptr + i * resw, resw);
+    }
+}
+
+void VideoOutput::ShutdownVideoResize(void)
+{
+    if (videotmpbuf)
+        delete [] videotmpbuf;
+    if (videoscontext)
+        img_resample_close(videoscontext);
+
+    videotmpbuf = NULL;
+    videoscontext = NULL;
+
+    resizeh_in = resizeh_out = -1;
+    resizew_in = resizew_out = -1;
+
+}
+
+void VideoOutput::SetVideoResize(const QRect &videoRect)
+{
+    if (!videoRect.isValid()    ||
+         videoRect.width()  < 1 ||
+         videoRect.height() < 1 ||
+         videoRect.left()   < 0 ||
+         videoRect.top()    < 0 )
+    {
+        resizeVideo = false;
+        ShutdownVideoResize();
+        videoResizeSize.setRect(0,0,0,0);
+        return;
+    }
+    resizeVideo = true;
+    videoResizeSize = videoRect;
+}
+
 /**
  * \fn VideoOutput::DisplayOSD(VideoFrame*,OSD *,int,int)
  * \brief If the OSD has changed, this will convert the OSD buffer
@@ -1204,6 +1332,9 @@
     if (!osd)
         return -1;
 
+    if(resizeVideo)
+        ResizeVideo(frame);
+
     OSDSurface *surface = osd->Display();
     if (!surface)
         return -1;
Index: mythtv/libs/libmythtv/videooutbase.h
===================================================================
--- mythtv/libs/libmythtv/videooutbase.h	(revision 9787)
+++ mythtv/libs/libmythtv/videooutbase.h	(working copy)
@@ -310,6 +310,9 @@
     /// \brief Updates frame displayed when video is paused.
     virtual void UpdatePauseFrame(void) = 0;
 
+    /// \brief Tells the player to resize the video frame (used for interactive)
+    void SetVideoResize(const QRect &videoRect);
+
   protected:
     void InitBuffers(int numdecode, bool extra_for_pause, int need_free,
                      int needprebuffer_normal, int needprebuffer_small,
@@ -327,6 +330,10 @@
     void DoPipResize(int pipwidth, int pipheight);
     void ShutdownPipResize(void);
 
+    void ShutdownVideoResize(void);
+    void ResizeVideo(VideoFrame *frame);
+    void DoVideoResize(int video_width, int video_height, int desired_width, int desired_height);
+
     void SetVideoAspectRatio(float aspect);
 
     /// Physical width of playback window in millimeters, used to compute display_aspect
@@ -391,6 +398,16 @@
     unsigned char      *piptmpbuf;
     ImgReSampleContext *pipscontext;
 
+    // video resizing
+    int resizew_in;
+    int resizeh_in;
+    int resizew_out;
+    int resizeh_out;
+    QRect videoResizeSize;
+    unsigned char      *videotmpbuf;
+    ImgReSampleContext *videoscontext;
+    bool resizeVideo;
+
     // Deinterlacing
     bool           m_deinterlacing;
     QString        m_deintfiltername;
Index: mythtv/libs/libmythtv/mhi.cpp
===================================================================
--- mythtv/libs/libmythtv/mhi.cpp	(revision 9787)
+++ mythtv/libs/libmythtv/mhi.cpp	(working copy)
@@ -415,7 +415,9 @@
 // e.g. part of the video may be clipped within the displayRect.
 void MHIContext::DrawVideo(const QRect &videoRect, const QRect &dispRect)
 {
-    (void) videoRect;
+    // tell the video player to resize the video stream
+    if (m_parent->GetNVP())
+        m_parent->GetNVP()->SetVideoResize(videoRect);
 
     QMutexLocker locker(&m_display_lock);
     QRect displayRect(dispRect.x() * m_displayWidth/StdDisplayWidth,
