itv->yuv_info.yuv_forced_update = 1;
                                return 0;
                        }
-                       if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
-                                r.width, r.height, r.left, r.top))
-                               itv->main_rect = r;
-                       else
-                               return -EINVAL;
                }
                return 0;
        }
                return ivtv_get_fmt(itv, id->type, fmt);
        }
 
+       case VIDIOC_CROPCAP: {
+               struct v4l2_cropcap *cropcap = arg;
+
+               if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
+                   cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
+                       return -EINVAL;
+               cropcap->bounds.top = cropcap->bounds.left = 0;
+               cropcap->bounds.width = 720;
+               if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
+                       cropcap->bounds.height = itv->is_50hz ? 576 : 480;
+                       cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
+                       cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
+               } else {
+                       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;
+               }
+               cropcap->defrect = cropcap->bounds;
+               return 0;
+       }
+
        case VIDIOC_S_CROP: {
                struct v4l2_crop *crop = arg;
 
+               if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
+                   (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
+                       if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
+                                crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
+                               itv->main_rect = crop->c;
+                               return 0;
+                       }
+                       return -EINVAL;
+               }
                if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
                        return -EINVAL;
                return itv->video_dec_func(itv, VIDIOC_S_CROP, arg);
        case VIDIOC_G_CROP: {
                struct v4l2_crop *crop = arg;
 
+               if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
+                   (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
+                       crop->c = itv->main_rect;
+                       return 0;
+               }
                if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
                        return -EINVAL;
                return itv->video_dec_func(itv, VIDIOC_G_CROP, arg);
        case VIDIOC_S_FMT:
        case VIDIOC_TRY_FMT:
        case VIDIOC_ENUM_FMT:
+       case VIDIOC_CROPCAP:
        case VIDIOC_G_CROP:
        case VIDIOC_S_CROP:
        case VIDIOC_G_FREQUENCY: