int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg)
 {
        struct ivtv_open_id *id = NULL;
+       struct yuv_playback_info *yi = &itv->yuv_info;
        u32 data[CX2341X_MBOX_MAX_DATA];
        int streamtype = 0;
 
                        cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
                        cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
                } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
-                       cropcap->bounds.width = itv->yuv_info.osd_full_w;
-                       cropcap->bounds.height = itv->yuv_info.osd_full_h;
+                       if (yi->track_osd) {
+                               cropcap->bounds.width = yi->osd_full_w;
+                               cropcap->bounds.height = yi->osd_full_h;
+                       } else {
+                               cropcap->bounds.width = 720;
+                               cropcap->bounds.height =
+                                               itv->is_out_50hz ? 576 : 480;
+                       }
                        cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
                        cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
                } else {
                if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
                    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
                        if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
-                               itv->yuv_info.main_rect = crop->c;
+                               yi->main_rect = crop->c;
                                return 0;
                        } else {
                                if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
                if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
                    (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
                        if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
-                               crop->c = itv->yuv_info.main_rect;
+                               crop->c = yi->main_rect;
                        else
                                crop->c = itv->main_rect;
                        return 0;
                        itv->main_rect.height = itv->params.height;
                        ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
                                720, itv->main_rect.height, 0, 0);
-                       itv->yuv_info.main_rect = itv->main_rect;
+                       yi->main_rect = itv->main_rect;
                        if (!itv->osd_info) {
-                               itv->yuv_info.osd_full_w = 720;
-                               itv->yuv_info.osd_full_h =
-                                               itv->is_out_50hz ? 576 : 480;
+                               yi->osd_full_w = 720;
+                               yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
                        }
                }
                break;
                        else
                                fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
                }
+               if (yi->track_osd)
+                       fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
                break;
        }
 
                        (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
                itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
                ivtv_set_osd_alpha(itv);
+               yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
                break;
        }
 
 
                f->src_w -= (osd_scale * osd_crop) >> 16;
        }
 
-       /* The OSD can be moved. Track to it */
-       f->dst_x += itv->yuv_info.osd_x_offset;
-       f->dst_y += itv->yuv_info.osd_y_offset;
+       if (itv->yuv_info.track_osd) {
+               /* The OSD can be moved. Track to it */
+               f->dst_x += itv->yuv_info.osd_x_offset;
+               f->dst_y += itv->yuv_info.osd_y_offset;
+       }
 
        /* Width & height for both src & dst must be even.
           Same for coordinates. */
        IVTV_DEBUG_YUV("Update yuv registers for frame %d\n", frame);
        f = yi->new_frame_info[frame];
 
-       /* Update the osd pan info */
-       f.pan_x = yi->osd_x_pan;
-       f.pan_y = yi->osd_y_pan;
-       f.vis_w = yi->osd_vis_w;
-       f.vis_h = yi->osd_vis_h;
+       if (yi->track_osd) {
+               /* Snapshot the osd pan info */
+               f.pan_x = yi->osd_x_pan;
+               f.pan_y = yi->osd_y_pan;
+               f.vis_w = yi->osd_vis_w;
+               f.vis_h = yi->osd_vis_h;
+       } else {
+               /* Not tracking the osd, so assume full screen */
+               f.pan_x = 0;
+               f.pan_y = 0;
+               f.vis_w = 720;
+               f.vis_h = yi->decode_height;
+       }
 
        /* Calculate the display window coordinates. Exit if nothing left */
        if (!(yuv_update = ivtv_yuv_window_setup(itv, &f)))
        /* Are we going to offset the Y plane */
        nf->offset_y = (nf->tru_h + nf->src_x < 512 - 16) ? 1 : 0;
 
-       /* Snapshot the osd pan info */
-       nf->pan_x = yi->osd_x_pan;
-       nf->pan_y = yi->osd_y_pan;
-       nf->vis_w = yi->osd_vis_w;
-       nf->vis_h = yi->osd_vis_h;
-
        nf->update = 0;
        nf->interlaced_y = 0;
        nf->interlaced_uv = 0;